package com.ohc.leetcode.字符串;

/**
 * 2022年5月6日10:09:18
 */
public class 反转字符串II541 {
    // 每隔k个进行反转
    //      * 输入：s = "abcdefg", k = 3
    // 1 2 3 4 5 6 7 8 9 10 11  K=3
    // 就是每个3个一组 从 1 2 3 开始 变成 3 2 1 然后跳过 4 5 6 到 7 8 9 第一段逻辑
    //  7 8 9 再反转，然后剩余字符是 10 11 剩余字符少于k个，就走第二段逻辑，将剩余字符全部反转
    //    1 2 3 4 5 6 7  8 9 10  11  比如k=3
    //  1 2 反转 然后跳过 3 4 再 5 6反转 跳过 7 8 然后关键在这里，剩余字符 是小于2k 但是大于k的 也就是剩余字符还有3个，就走第三个逻辑
    public static String reverseStr(String s, int k) {
        int i = 0;
        int length = s.length();
        StringBuilder builder = new StringBuilder();
        while (i < length) {  // 遍历字符串   substring是左闭右开的
            if (length - i >= 2 * k) { //就反转这 2k 字符中的前 k 个字符。
                builder.append(new StringBuilder(s.substring(i, i + k)).reverse());
                builder.append(new StringBuilder(s.substring(i + k, i + 2 * k)));
            } else if (length - i < k) {  // 如果剩余字符少于 k 个，则将剩余字符全部反转。
                builder.append(new StringBuilder(s.substring(i)).reverse());
            } else if (length - i <= 2 * k) { // 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
                builder.append(new StringBuilder(s.substring(i, i + k)).reverse());
                builder.append(new StringBuilder(s.substring(i + k)));
            }
            i = i + 2 * k; // 因为会反转再跳过，所以是加上2*k
        }
        return builder.toString();
    }

    public static void main(String[] args) {
        String str = "abcdefg";
        String s = reverseStr(str, 2);
        System.out.println("s = " + s);

    }

    /** abcdefgad
     * 输入：s = "abcdefg", k = 2
     * 输出："bacdfeg"
     *   “ abcdq”;
     * 左闭右开
     * public String reverseStr(String s, int k) {
     *     int len = s.length();
     *     StringBuilder sb = new StringBuilder();
     *     int i = 0;
     *     while (i <= len) {
     *         if (len - i >= 2 * k) { // 剩余字符 大于等于 2k 个，反转前 k 个
     *             // 反转前 k 个
     *             sb.append(new StringBuilder(s.substring(i, i + k)).reverse());
     *             // 剩下 k 个正常拼接
     *             sb.append(s.substring(i + k, i + 2 * k));
     *         } else if (len - i < k) { // 剩余字符小于 k 个，将剩余字符全部反转
     *             // 反转全部字符
     *             sb.append(new StringBuilder(s.substring(i)).reverse());
     *         } else if (len - i >= k) { // 剩余字符大于 k 小于 2k, 反转前 k 个
     *             // 反转前 k 个
     *             sb.append(new StringBuilder(s.substring(i, i + k)).reverse());
     *             // 剩下的正常拼接
     *             sb.append(s.substring(i + k));
     *         }
     *         i += 2 * k;
     *     }
     *     return sb.toString();
     * }
     */
}
